#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：NoBad 
@File    ：larg_models_tool.py
@Author  ：LYP
@Date    ：2025/10/31 9:48 
@description :
"""

from volcenginesdkarkruntime import Ark

from models.models import PromptTemplate
from tool.tools import getEnvConfig, logger

from django.utils.translation import gettext as _

class VolcEngineArk(object):
    """"""

    def __init__(self, image_url_list: list, prompt_id: int, model: str = getEnvConfig("ARK_MODEL"), add_text=None):
        self.image_urls = image_url_list
        self.prompt_id = prompt_id
        self.model = model
        self.base_url = getEnvConfig("VOLCENGINE_BASE_URL")
        self.api_key = getEnvConfig("ARK_API_KEY")
        self.client = Ark(api_key=self.api_key)
        self.prompt_text = self.get_prompt_text()
        if not self.image_urls:
            raise ValueError(_("请传入至少一个图片地址"))
        content = [{"type": "image_url", "image_url": {"url": url}} for url in self.image_urls]
        message_add = _("""
        # 一、强制输出规则（违反则无效）
        1. 输出格式为标准JSON，无任何多余内容（无注释、无换行、无特殊符号、无代码块），可直接用json.loads解析。
        2. 严格遵循以下结构，字段不可缺失、不可新增，数据类型正确（分数为整数，summary为字符串）。
        3. 根据对话判断对方是男或女，不用表述出来，仅在gender数据里。
        # 二、输出结构（强制要求）
                {
                    "result": {
                        "poster": {
                            "flags": {"关键词1": 整数分数, "关键词2": 整数分数, "关键词3": 整数分数, "关键词4": 整数分数},
                            "summary": "一句话总结（格式：TA是一个XXXX，字数20-30字）"
                            "gender":"male或female"
                        },
                        "report": {
                            "summary": "法医结论行动建议一句话总结（格式：字数200字）不显示“法医结论字样”",
                            "flags": {"风险关键词1": 整数分数, "风险关键词2": 整数分数, "风险关键词3": 整数分数, "风险关键词4": 整数分数},
                            "danger":"最隐蔽风险",
                            "advise":"行动建议",
                            "advise_summary":"行动建议核心结论",
                            "detail":"{"详细解读段落1":"内容","详细解读段落2":"内容","详细解读段落3":"",....}}"
                        }"
                    }
                }
        # 三、输出结构组成示例：
                    reslut:{
                        poster:{
                        “海报要求”
                        }
                        report:{
                        “报告要求”
                        }
                    }
        ### 3.1海报要求：
            必须4个关键词，每个关键字的分数根据分析出的结果应为不同数值：
            flags: {"词1":分数,"词2":分数,"词3":分数,"词4":分数}
            summary:一句话总结（如“TA是一个XXXX”，字数限制为20-40字）
        ### 3.2报告要求：
            必须4个风险评分，每个风险评分关键字有分数
            summary总结,只包含结果，不含标题
            activate行动建议：一句话不分点。
            detail内容为字典格式{"key":"value"}可以有多个
        # 四、中文语言返回结果
        """)
        logger.info("==========当前语言为：===========")
        logger.info(message_add)
        content.append({"type": "text", "text": self.prompt_text})
        content.append({"type": "text", "text": message_add})
        if add_text:
            content.append({"type": "text", "text": add_text})
        self.messages = [{"role": "user", "content": content}]

    def genterateFlags(self):
        """
        获取分析的结果
        :return:
        """
        completion = self.client.chat.completions.create(model=self.model, messages=self.messages)
        result = completion.choices[0].message.content
        return result

    def get_prompt_text(self):
        """
        获取提示语
        :return:
        """
        prompt = PromptTemplate.objects.get(id=self.prompt_id).prompt_content
        return prompt
